import fs from 'fs'
import path from 'path'
import { spawn } from 'child_process';

// 服务器中间件配置


export function configureServer(server, runtimeConf) {
    // POST 请求处理 - 接收代码并直接返回 SSE 流
    server.middlewares.use('/api/run-code', (req, res) => {
        if (req.method === 'POST') {
            let body = '';
            req.on('data', chunk => {
                body += chunk.toString();
            });
            req.on('end', () => {
                try {
                    const data = JSON.parse(body);
                    const { id, lang, fileName, code } = data;

                    // 在服务器控制台打印文件路径和代码内容
                    console.log('\n========== 文件: ' + fileName + ' ==========');
                    console.log(code);
                    console.log('================================\n');

                    // 获取文件所在的目录
                    const dirPath = path.dirname(fileName);
                    // 创建文件名：id.lang
                    const execFileName = path.join(dirPath, `${id}.${runtimeConf[lang].ext || lang}`);

                    // 确保目录存在
                    fs.mkdirSync(path.dirname(execFileName), { recursive: true });

                    // 写入代码到文件
                    fs.writeFileSync(execFileName, code);
                    console.log(`已创建文件: ${execFileName}`);

                    // 设置 SSE 响应头
                    res.writeHead(200, {
                        'Content-Type': 'text/event-stream',
                        'Cache-Control': 'no-cache',
                        'Connection': 'keep-alive',
                        'X-Accel-Buffering': 'no' // 禁用 Nginx 缓冲
                    });

                    // 发送 SSE 消息的函数
                    const sendSSE = (event, data) => {
                        console.log("%c Line:55 🌰 sendSSE", "color:#7f2b82", event, data);
                        res.write(`event: ${event}\n`);
                        res.write(`data: ${JSON.stringify(data)}\n\n`);
                    };


                    // 根据不同语言执行文件
                    let command, args;

                    if (runtimeConf[lang]) {
                        command = runtimeConf[lang].cmd
                        args = [...(runtimeConf[lang]?.args), execFileName]
                    } else {
                        sendSSE('error', { message: `不支持执行 ${lang} 类型的文件` });
                        sendSSE('close', { message: '执行结束-err' });
                        res.end();
                        return;
                    }

                    console.log("%c Line:70 🍌", "color:#6ec1c2");
                    // 执行文件并通过 SSE 返回结果
                    const process = spawn(command, args, {
                        cwd: path.dirname(execFileName)
                    });

                    // 将标准输出通过 SSE 发送
                    process.stdout.on('data', (data) => {
                        sendSSE('stdout', { message: data.toString() });
                    });

                    // 将标准错误通过 SSE 发送
                    process.stderr.on('data', (data) => {
                        sendSSE('stderr', { message: data.toString() });
                    });

                    // 进程结束时发送关闭事件并删除临时文件
                    process.on('close', (code) => {
                        sendSSE('close', { message: '执行结束-close' });

                        // 删除临时文件
                        try {
                            if (fs.existsSync(execFileName)) {
                                fs.unlinkSync(execFileName);
                                console.log(`已删除临时文件: ${execFileName}`);

                            }
                        } catch (err) {
                            console.error(`删除文件出错: ${err.message}`);
                        }
                        res.end();
                    });

                    // 处理执行错误
                    process.on('error', (err) => {
                        sendSSE('error', { message: `执行错误: ${err.message}` });

                        // 删除临时文件
                        try {
                            if (fs.existsSync(execFileName)) {
                                fs.unlinkSync(execFileName);
                                console.log(`已删除临时文件: ${execFileName}`);
                                sendSSE('info', { message: `已删除临时文件: ${id}.${lang}` });
                            }
                        } catch (deleteErr) {
                            console.error(`删除文件出错: ${deleteErr.message}`);
                            sendSSE('error', { message: `删除文件出错: ${deleteErr.message}` });
                        }

                        sendSSE('close', { message: '执行结束-err2' });
                        res.end();
                    });
                } catch (error) {
                    console.error('解析请求数据出错:', error);
                    res.statusCode = 500;
                    res.setHeader('Content-Type', 'application/json');
                    res.end(JSON.stringify({ success: false, message: `处理请求出错: ${error.message}` }));
                }
            });
        } else {
            res.statusCode = 405;
            res.setHeader('Content-Type', 'application/json');
            res.end(JSON.stringify({ success: false, message: '只支持 POST 请求' }));
        }
    });
}
